package com.stu.day08.equals;

import java.util.Objects;

/**
 * 如果对象是类或其子类的实例，或者实现了某个接口，则返回 true。
 * 如果对象不是指定类型的实例，则返回 false。
 * 如果对象为 null，则返回 false
 *
 * @author zy
 * @date 2025/1/29 14:58
 */
class Animal {}
class Dog extends Animal {
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;  // 同一个对象直接返回true,提高效率
        // 如果o不是 Dog类型，直接返回 false（两个不同类型的对象不可能相等）。
        // 如果o是 Dog类型，Java 16+ 采用模式匹配（Pattern Matching）语法,
        // 自动转换o为 Dog类型，赋值给dog，避免了手动类型转换：(前提是o的运行时类型是Dog,也就是判断为true时才进行转换)
        // Dog dog = (Dog) o; // Java 16之前手动
        if (!(o instanceof Dog dog)) return false;
        return Objects.equals(name, dog.name);  // 源码:return (a == b) || (a != null && a.equals(b));
        // Object里面的equals可以同时使用值比较和子类重写了equals方法后的比较方式
        // 比如此处用的是String重写的equals,比较的是值,不是简单的用==比较地址
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(name);
    }
}

public class InstanceofDemo {
    public static void main(String[] args) {
        Animal a = new Dog();  // 向上转型
        System.out.println(a instanceof Animal);  // true
        System.out.println(a instanceof Dog);     // 虽然编译时类型是 Animal，但运行时类型是 Dog,所以返回 true。
        System.out.println(a instanceof Object);  // true
//        System.out.println(a instanceof String);  // 编译错误
    }
}
